package com.axzhengxin.platform.sync.impl;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.db.ds.DSFactory;
import com.axzhengxin.platform.sync.ISyncDataService;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.mapper.SysDeptMapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Service;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * SysDeptSyncServiceImpl
 * 机构信息同步
 *
 * @author jiangnan
 * @date 2021/3/25
 */
@Slf4j
@Service("syncSysDept")
public class SysDeptSyncServiceImpl implements ISyncDataService {

    @Autowired
    private SysDeptMapper sysDeptService;

    @SneakyThrows
    @Override
    public void exec() {
        String profile = SpringUtils.getActiveProfile();
        // 查询所有状态正常的机构，排除顶级机构企业征信中心
        List<SysDept> sourceDeptList = Db.use(DSFactory.get(profile))
                .find(Entity.create("sys_dept").set("status", "0").set("del_flag", "0"))
                .stream()
                .filter(MapUtil::isNotEmpty)
                .map(entity -> entity.toBeanIgnoreCase(SysDept.class))
                .collect(Collectors.toList());
        //将所有有金融机构代码的机构提取出来做好映射，机构ID -> 金融机构代码
        Map<Long, String> deptIdFinanceIdMapper = sourceDeptList
                .stream()
                .filter(dept -> 0 != dept.getParentId())
                .filter(dept -> StrUtil.isNotBlank(dept.getFinanceId()))
                .collect(Collectors.toMap(SysDept::getDeptId, SysDept::getFinanceId));
        // 开始处理可能没有金融机构代码，或者金融机构代码与上级机构不符的情况
        sourceDeptList
                .stream()
                // 排除企业征信中心自身
                .filter(dept -> 0 != dept.getParentId())
                // 排除总行级机构，他们如果没有金融机构代码就不处理
                .filter(dept -> 13L != dept.getParentId())
                // 根据机构代码排序，总是让更早建立的机构更早处理
                .sorted(Comparator.comparingLong(SysDept::getDeptId))
                .forEach(dept -> {
                    Long parentId = dept.getParentId();
                    String parentFinanceId = deptIdFinanceIdMapper.get(parentId);
                    // 处理两种情况，本机构没有金融机构代码，或者本机构金融机构代码与上级不符
                    if (StrUtil.isBlank(dept.getFinanceId())
                            || !dept.getFinanceId().equalsIgnoreCase(parentFinanceId)) {
                        // 设本机构金融机构代码为上级机构的金融机构代码
                        dept.setFinanceId(parentFinanceId);
                        deptIdFinanceIdMapper.put(dept.getDeptId(), dept.getFinanceId());
                    }
                });
        sourceDeptList.forEach(sysDeptService::insertDept);
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }

}
